/**
 * ajax请求，用于mobile端
 */
import axios from 'axios';
import Vue from 'vue';

import Tools from '@/tools/index';
import Utils from '@/utils/index';


let isToLogin = false;

let instance = null;


export default {

    _axios(data_, config_, appWindow_) {


        let that = this;
        return new Promise((resolve, reject) => {

            let _data = that.toDefaultData(data_, config_, appWindow_);
            let _axiosData = that.toData(_data, config_, appWindow_);
            if (!_axiosData) {
                console.error("非法请求", _data);
                // reject({})
                that.notLogin('');
                return
            }
            setTimeout(function () {

                instance(_axiosData).then(function (res) {

                    console.groupCollapsed("%c 接口 ", "background:#35495E; padding: 1px; border-radius:3px; color: #fff;", appWindow_.MicroAppConfiguration.config.type, appWindow_.MicroAppConfiguration.config.name, _data.url);
                    console.log("%c ——请求 domain", "font-weight: bold; color: #35495E;", _axiosData.url);
                    console.log("%c ——请求 配置", "font-weight: bold; color: #35495E;", data_);
                    console.log("%c ——请求 data", "font-weight: bold; color: #35495E;", _axiosData.data);
                    console.log("%c ——请求 params", "font-weight: bold; color: #35495E;", _axiosData.params);
                    console.log("%c ——返回 数据", "font-weight: bold; color: #35495E;", res.data);
                    console.log("%c                                                                                                                              ", "border-bottom:1px solid #aaa; margin-left:-22px;margin-bottom:-10px;");
                    console.groupEnd();
                    // console.log("appWindow_.MicroAppConfiguration",JSON.stringify(appWindow_.MicroAppConfiguration))

                    if (_data.isLoading) {
                        Tools.setLoad(false);
                    }

                    // 返回数据正常
                    if (res.data.code == '200') {
                        if (_data.isDataSource) {
                            res._ok = true;
                            resolve(res)
                        } else {
                            res.data._ok = true;
                            resolve(res.data)
                        }

                    }
                    // 需登录
                    else if (res.data.code == "401") {
                        res._ok = false;
                        resolve(res);
                        that.notLogin(res.data.message);
                    }
                    // 其他提示
                    else {
                        res._ok = false;
                        resolve(res);
                        if (_data.isErrorAlert) {
                            that.showToast(res.data.message);
                        }
                    }
                }, (res) => {
                    res._ok = false;
                    resolve(res);
                    if (_data.isLoading) {
                        Tools.setLoad(false);
                    }
                    if (_data.isErrorAlert) {
                        console.log("服务器异常", res)
                        that.showToast("服务器异常");
                    }
                });

            }, _data.delayTime)
        });




    },


    toData(_data, config_, appWindow_) {
        let that = this;
        // 拼接请求参数
        let _axiosData = {
            timeout:60000,
            headers: {}
        };
        // 请求地址

        if (!appWindow_) {
            console.error("*************", _data.url, "接口缺少window对象")
            that.showToast("请求缺少window对象");
        }
        let _domain = appWindow_.MicroAppConfiguration.config.domain;
        if (_data.domain) {
            _domain = _data.domain;
        }
        for(let i in Vue.prototype.$AppsConfig.apiDomain){
            if(i==_domain){
                _domain = Vue.prototype.$AppsConfig.apiDomain[i]
            }
        }
       
        _axiosData.url = _domain + _data.url;


        // 请求方式
        _axiosData.method = _data.method;


        // query形式传参
        if (_data.params) {
            _axiosData.params = _data.params;
        }
        // 是否显示加载框遮罩层
        if (_data.isLoading) {
            Tools.setLoad(true);
        }


        let _dataParams = {};

        if (_data.isSid) {
            // 站点id
            if (Tools.getProjectType() == "site" || Tools.getProjectType() == "store") {
                if (!Tools.getSid()) {
                    console.error("未获取到sid");
                    return false
                }
                _axiosData.headers.opSiteId = Tools.getSid()
                _dataParams.platformId = Tools.getSid()
            }
            // 平台管理传 0
            if (Tools.getProjectType() == "admin") {
                _axiosData.headers.opSiteId = 0
                _dataParams.platformId = 0
            }
            else {

            }
        }


        // 如果是门店
        if (Tools.getProjectType() == "store") {
            _dataParams.clientType = "store";
        }
        // 如果是站点
        else if (Tools.getProjectType() == "site") {
            _dataParams.clientType = "platform";
        }

        // 如果是插件应用
        if (appWindow_.MicroAppConfiguration.config.type == "apps") {
            // 应用唯一标识
            _dataParams.appCode = appWindow_.MicroAppConfiguration.config.name;
            // 如果是门店
            if (Tools.getProjectType() == "store") {

                if (!Tools.getStoreId()) {
                    console.error("未获取到sid2");
                    return false
                }
                _dataParams.storeId = Tools.getStoreId();
                if (!Tools.getSystemLinkType()) {
                    console.error("未获取到linkType");
                    return false
                }
                _dataParams.linkType = Tools.getSystemLinkType();
            }
            // 如果是站点
            else if (Tools.getProjectType() == "site") {

            }
        }


        if (Utils.isEmpty(_data.data)) {
            _data.data = {}
        } 

        // 用于文件上传
        if(_data.dataType=="formData"){
            let _fd = new FormData();
            for(let i in _data.data){
                _fd.append(i,_data.data[i])
            }
            for(let i in _dataParams){
                _fd.append(i,_dataParams[i])
            }
            _axiosData.data = _fd
        }
        // data 参数序列化
        else if (_data.isQsData) {
            for(let i in _dataParams){
                _data.data[i] = _dataParams[i]
            }
            _axiosData.data = Vue.prototype.$Qs.parse(_data.data)
        }
        // data 参数不序列化
         else {
            _axiosData.data = _data.data
        }
        
       

        // 请求进度 主用于上传文件
        _axiosData.onUploadProgress = (progressEvent) => {
            // //原生获取上传进度的事件
            if (progressEvent.lengthComputable) {
                progressEvent.percentage = Math.ceil((progressEvent.loaded / progressEvent.total) * 100);
                if (_data.onUploadProgress) {
                    _data.onUploadProgress(progressEvent);
                    // console.error("progressEvent",progressEvent.loaded,progressEvent.total,progressEvent)
                    //   //属性lengthComputable主要表明总共需要完成的工作量和已经完成的工作是否可以被测量
                    //   //如果lengthComputable为false，就获取不到progressEvent.total和progressEvent.loaded
                    //   callback1(progressEvent);
                }
            }
        };


        // 如果需要传token
        if (_data.isToken) {

            let _token = Tools.getToken();
            if (!_token) {
                console.error("_token不存在");
                return false
            } else {
                _axiosData.headers.Authorization = _token.tokenHead + _token.token

                return _axiosData
            }
        } else {
            return _axiosData
        }
    },
    // 重新登录
    notLogin(message) {
        Tools.setLoad(false);
        console.error("重新登录")
        if (isToLogin) {
            console.log("已阻止短期多次重复登录");
            return;
        }
        isToLogin = true;
        setTimeout(function () {
            isToLogin = false;
        }, 1000)
        if (!message) {
            this.showToast("请重新登录");
        } else {
            this.showToast(message);
        }
        Tools.toLogin();
    },
    /**
     * 过滤解析请求参数方法，用于当请求参数不传时设置默认值
     * 请求参数
     * @param {*} _data 
     */

    toDefaultData(_data, config_, appWindow_) {
        // 初始化
        if (!instance) {
            instance = axios.create({
                timeout: 60000
            })
        }

        for (let i in config_) {
            if (_data[i] == undefined) {
                _data[i] = config_[i]
            }
        }


        return _data;

    },
    showToast(value) {
        Tools.messageError(value);
    },
}